{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1、逻辑回归\n",
    "\n",
    "在这部分练习中，你将构建一个逻辑回归模型预测一个学生是否会被大学录取。假设你是某个大学院系的管理人员，你打算根据申请人两次考试的成绩来判断他们被录取的可能性。你有可以用作逻辑回归训练集的以前申请者的历史数据。每个训练样本都包含历史申请人两次考试的成绩和最终的录取结果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>exam1</th>\n",
       "      <th>exam2</th>\n",
       "      <th>admitted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34.623660</td>\n",
       "      <td>78.024693</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30.286711</td>\n",
       "      <td>43.894998</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>35.847409</td>\n",
       "      <td>72.902198</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>60.182599</td>\n",
       "      <td>86.308552</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>79.032736</td>\n",
       "      <td>75.344376</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       exam1      exam2  admitted\n",
       "0  34.623660  78.024693         0\n",
       "1  30.286711  43.894998         0\n",
       "2  35.847409  72.902198         0\n",
       "3  60.182599  86.308552         1\n",
       "4  79.032736  75.344376         1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 加载数据\n",
    "data = pd.read_csv('ex2/ex2data1.txt', names=['exam1', 'exam2', 'admitted'])\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.1 可视化数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmcAAAHjCAYAAABme7hCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3X98XVWd7//3JxQo0WIoVgfBJBWrgvwoEBAcBoECwgiCVx3BXESHa9SBIVRRcXIvRB/Wr371MTW9OnI7IuAQC1JFuDOOilUGB5ExReRHC4NgEjtUWgrhhwUF8rl/7L2bk0NycpLzY6+99+v5eORxsndOkpWdnHPeWeuz1jJ3FwAAAMLQknYDAAAAMIFwBgAAEBDCGQAAQEAIZwAAAAEhnAEAAASEcAYAABAQwhkAAEBACGcAAAABIZwBAAAEZF7aDajFy1/+cu/s7Ey7GQAAADNav379o+6+aKb7ZTqcdXZ2amhoKO1mAAAAzMjMRqq5H8OaAAAAASGcAQAABIRwBgAAEJBM15wBAFB0zz33nDZt2qRnn3027aYgNn/+fO2zzz7aeeed5/T5hDMAADJs06ZNWrBggTo7O2VmaTen8Nxd27Zt06ZNm7R48eI5fQ2GNQEAyLBnn31We+65J8EsEGamPffcs6aeTMIZAAAZRzALS62/D8IZAABAQAhnAACgZtdff73MTPfdd9+UH3//+9+vtWvXVv31Hn74Yb3rXe+SJN155536/ve/v+NjN998s37+85/Puo2dnZ169NFHZ/15zUY4AwCgQAYHpc5OqaUluh0crM/XXbNmjY4++mhdc801dfl6r3rVq3aEuXqFs6xoWDgzs2+Y2RYzu6fk3EIzu8nMHohv94jPm5mtMrPfmNldZnZoo9oFAEBRDQ5KPT3SyIjkHt329NQe0J5++mndeuutuvzyy3eEM3fX+eefr/33319ve9vbtGXLlh337+zs1N/93d/pqKOOUldXl+644w699a1v1b777qvLLrtMkjQ8PKwDDjhAf/rTn3TJJZfo2muv1dKlS/WFL3xBl112mVauXKmlS5fqZz/7mbZu3ap3vvOdOvzww3X44Yfr1ltvlSRt27ZNJ510kg455BB96EMfkrvX9oM2SSOX0rhS0lckfbPk3MWS1rn7583s4vj4k5JOkbQkfnuTpK/FtwAAoE76+qTt2yef2749Ot/dPfev+73vfU8nn3yyXve612nhwoW64447NDw8rPvvv1933323HnnkEe2///7667/+6x2f8+pXv1q33Xabli9frve///269dZb9eyzz+qNb3yjPvzhD++43y677KLPfOYzGhoa0le+8hVJ0jPPPKOXvvSluuiiiyRJ733ve7V8+XIdffTRGh0d1Vvf+lZt3LhRn/70p3X00Ufrkksu0b/8y79o9erVc/8hm6hh4czdbzGzzrLTp0s6Nn7/Kkk3Kwpnp0v6pkeR9hdm1mZme7n75ka1DwCAohkdnd35aq1Zs0YXXnihJOnMM8/UmjVr9Nxzz+mss87STjvtpFe96lU6/vjjJ33O29/+dknSgQceqKeffloLFizQggULNH/+fI2Njc3q+//4xz/Whg0bdhw/+eSTeuqpp3TLLbfou9/9riTpbW97m/bYY49afsymafYitK9MApe7bzazV8Tn95b0u5L7bYrPEc4AAKiT9vZoKHOq83O1bds2/eQnP9E999wjM9MLL7wgM9M73vGOiktK7LrrrpKklpaWHe8nx88///ys2jA+Pq7bbrtNu+2224s+lsVlRkKZEDDVlZtyYNjMesxsyMyGtm7d2uBmAQCQHytWSK2tk8+1tkbn52rt2rV63/vep5GREQ0PD+t3v/udFi9erIULF+qaa67RCy+8oM2bN+unP/3pnL/HggUL9NRTT017fNJJJ+0Y8pSiCQSSdMwxx2gwLqj713/9Vz3++ONzbkMzNTucPWJme0lSfJtUB26S9OqS++0j6eGpvoC7r3b3LnfvWrRoUUMbCwBAnnR3S6tXSx0dkll0u3p1bfVma9as0Tve8Y5J5975znfq97//vZYsWaIDDzxQH/nIR/SWt7xlzt/juOOO04YNG7R06VJde+21Ou2003T99dfvmBCwatUqDQ0N6aCDDtL++++/Y1LBpZdeqltuuUWHHnqofvSjH6m9li7CJrJGzlyIa87+2d0PiI+/KGlbyYSAhe7+CTN7m6TzJf2lookAq9z9iJm+fldXlw8NDTWs/alxjx410x0DABDbuHGj9ttvv7SbgTJT/V7MbL27d830uY1cSmONpNskvd7MNpnZuZI+L+lEM3tA0onxsSR9X9JDkn4j6R8l/U2j2hW8/n5p+fIokEnR7fLl0XkAAJB7jZytedY0H1o2xX1d0nmNaktmuEtjY9LAQHS8cmUUzAYGpN5eetAAACiAZs/WRCVmUSCTokCWhLTe3ug8wQwAgNwLZbYmEqUBLUEwAwCgMAhnoUlqzEqV1qABAIBcI5yFJAlmSY3Z+Hh0OzBAQAMAoCAIZyExk9raJteYrVwZHbe1MbQJAKhd+T/6dfjH38z0sY99bMfxl770JfXPsMrA9773vUlbLk3l4IMP1llnTTe/cGJz9Nm45JJL9OMf/1iS9OUvf1nbSzYb/dznPjerryVJV155pc4///xZf14lhLPQ9PdPrjFLAhpLaQCFMDgodXZKLS3Rbby4OVAfDVquadddd9V3v/tdPfroo1V/zkzhbOPGjRofH9ctt9yiP/zhDzW1r9RnPvMZnXDCCZLqE84agXAWovIesgz1mPHCAszd4KDU0xPtfege3fb08DhCnZQu15QEtKSUZmysph60efPmqaenRyvLJ7RJGhkZ0bJly3TQQQdp2bJlGh0d1c9//nPdeOON+vjHP66lS5fqwQcffNHnfetb39LZZ5+tk046STfeeOOO8+vXr9fBBx+so446Sl/96ld3nL/yyit1xhln6LTTTtPixYv1la98RX//93+vQw45REceeaQee+wxSdL73/9+rV27VqtWrdLDDz+s4447Tscdd5wuvvhiPfPMM1q6dKm64y0Trr76ah1xxBFaunSpPvShD+mFF16QJF1xxRV63etep7e85S269dZb53zdpuXumX077LDDHOG4+mr31lb36BEevbW2RucBzKyjY/LjJ3nr6Ei7ZQjZhg0bqr/z+Lh7b+/kP7De3uh8DV7ykpf4E0884R0dHT42NuZf/OIX/dJLL3V391NPPdWvvPJKd3e//PLL/fTTT3d393POOcevu+66ab/mkiVLfHh42H/4wx/6aaedtuP8gQce6DfffLO7u1900UX+xje+0d3dr7jiCt933339ySef9C1btvjuu+/uX/va19zd/cILL/SVK1e+6Pt2dHT41q1bJ/0ciQ0bNvipp57qf/rTn9zd/SMf+YhfddVV/vDDD/urX/1q37Jli//xj3/0N7/5zX7eeee9qP1T/V4kDXkV+YaeM9RNX59U0jssKTru60unPUDWjI7O7jwwaw1crmn33XfX+973Pq1atWrS+dtuu03vfe97JUlnn322/v3f/33Gr/XLX/5SixYt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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "positive = data[data['admitted'] == 1]\n",
    "negative = data[data['admitted'] == 0]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(10,8))\n",
    "ax.scatter(positive['exam1'], positive['exam2'], c='b', marker='o', label='Admitted')\n",
    "ax.scatter(negative['exam1'], negative['exam2'], c='r', marker='x', label='Not Admitted')\n",
    "\n",
    "ax.legend()\n",
    "ax.set_xlabel('Exam 1 Score')\n",
    "ax.set_ylabel('Exam 2 Score')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.2 Sigmoid函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "让我们做一个快速的检查，来确保它可以工作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<function matplotlib.pyplot.show(*args, **kw)>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x1 = np.arange(-10, 10, 0.1)\n",
    "plt.plot(x1, sigmoid(x1), c='r')\n",
    "plt.show"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "fine!\n",
    "\n",
    "## 1.3 Cost Function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cost(theta, X, y):\n",
    "    first = (-y) * np.log(sigmoid(X @ theta))\n",
    "    second = (1 - y) * np.log(1 - sigmoid(X @ theta))\n",
    "    \n",
    "    return np.mean(first - second)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在，我们要做一些设置，获取我们的训练集数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "if 'ones' not in data.columns:\n",
    "    data.insert(0, 'ones', 1)\n",
    "\n",
    "# 设置训练集和目标变量\n",
    "X = data.iloc[:, :-1].values\n",
    "y = data.iloc[:, -1].values\n",
    "\n",
    "theta = np.zeros(X.shape[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((100, 3), (3,), (100,))"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检查矩阵维度，确保一切良好\n",
    "X.shape, theta.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6931471805599453"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cost(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.4 Gradient\n",
    "\n",
    "* 批量梯度下降\n",
    "* 转化为向量化计算：$\\frac{1}{m}X^T(Sigmoid(Xθ) - y)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient(theta, X, y):\n",
    "    return (X.T @ (sigmoid(X @ theta) - y)) / len(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ -0.1       , -12.00921659, -11.26284221])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gradient(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.5 学习θ参数\n",
    "\n",
    "注意，我们实际上没有在这个函数中执行梯度下降，我们仅仅在计算梯度。在练习中，一个称为“fminunc”的Octave函数是用来优化函数来计算成本和梯度参数。由于我们使用Python，我们可以用SciPy的“optimize”命名空间来做同样的事情。\n",
    "\n",
    "这里我们使用的是高级优化算法，运行速度通常远远超过梯度下降。方便快捷。\n",
    "只需传入cost函数，已经所求的变量theta，和梯度。cost函数定义变量时变量tehta要放在第一个，若cost函数只返回cost，则设置fprime=gradient。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([-25.16131853,   0.20623159,   0.20147149]), 36, 0)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import scipy.optimize as opt\n",
    "\n",
    "result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.203497701589475"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cost(result[0], X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.6 评估逻辑回归\n",
    "\n",
    "学习好了参数θ后，我们来用这个模型预测某个学生是否能被录取。\n",
    "\n",
    "接下来，我们需要编写一个函数，用我们所学的参数theta来为数据集X输出预测。然后，我们可以使用这个函数来给我们的分类器的训练精度打分。\n",
    "\n",
    "逻辑回归模型的假设函数：\n",
    "$$h_θ(x) = \\frac{1}{1+e^{-θ^TX}}$$\n",
    "\n",
    "当$h_θ$大于等于0.5时，预测 y=1\n",
    "\n",
    "当$h_θ$小于0.5时，预测 y=0 。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(theta, X):\n",
    "    predictions = sigmoid(X @ theta)\n",
    "    return [1 if x >= 0.5 else 0 for x in predictions]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.89"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算预测精度\n",
    "final_theta = result[0]\n",
    "predictions = predict(final_theta, X)\n",
    "correct = [1 if a==b else 0 for (a, b) in zip(predictions, y)]\n",
    "accuracy = sum(correct) / len(X)\n",
    "accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.7 决策边界\n",
    "\n",
    "X × θ = 0 (this is the line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "x1 = np.arange(130, step=0.1)\n",
    "x2 = -(final_theta[0] + x1*final_theta[1]) / final_theta[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(8,5))\n",
    "ax.scatter(positive['exam1'], positive['exam2'], c='b', label='Admitted')\n",
    "ax.scatter(negative['exam1'], negative['exam2'], s=50, c='r', marker='x', label='Not Admitted')\n",
    "ax.plot(x1, x2)\n",
    "ax.set_xlim(0, 130)\n",
    "ax.set_ylim(0, 130)\n",
    "ax.set_xlabel('x1')\n",
    "ax.set_ylabel('x2')\n",
    "ax.set_title('Decision Boundary')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2、正则化逻辑回归\n",
    "\n",
    "在训练的第二部分，我们将要通过加入正则项提升逻辑回归算法。简而言之，正则化是成本函数中的一个术语，它使算法更倾向于“更简单”的模型（在这种情况下，模型将更小的系数）。这个理论助于减少过拟合，提高模型的泛化能力。这样，我们开始吧。\n",
    "\n",
    "设想你是工厂的生产主管，你有一些芯片在两次测试中的测试结果。对于这两次测试，你想决定是否芯片要被接受或抛弃。为了帮助你做出艰难的决定，你拥有过去芯片的测试数据集，从其中你可以构建一个逻辑回归模型。\n",
    "\n",
    "## 2.1 可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Test 1</th>\n",
       "      <th>Test 2</th>\n",
       "      <th>Accepted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.051267</td>\n",
       "      <td>0.69956</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.092742</td>\n",
       "      <td>0.68494</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.213710</td>\n",
       "      <td>0.69225</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.375000</td>\n",
       "      <td>0.50219</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.513250</td>\n",
       "      <td>0.46564</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Test 1   Test 2  Accepted\n",
       "0  0.051267  0.69956         1\n",
       "1 -0.092742  0.68494         1\n",
       "2 -0.213710  0.69225         1\n",
       "3 -0.375000  0.50219         1\n",
       "4 -0.513250  0.46564         1"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data2 = pd.read_csv('ex2/ex2data2.txt', names=['Test 1', 'Test 2', 'Accepted'])\n",
    "data2.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_data():\n",
    "    positive = data2[data2['Accepted'].isin([1])]\n",
    "    negative = data2[data2['Accepted'].isin([0])]\n",
    "\n",
    "    fig, ax = plt.subplots(figsize=(8,5))\n",
    "    ax.scatter(positive['Test 1'], positive['Test 2'], s=50, c='b', marker='o', label='Accepted')\n",
    "    ax.scatter(negative['Test 1'], negative['Test 2'], s=50, c='r', marker='x', label='Rejected')\n",
    "    ax.legend()\n",
    "    ax.set_xlabel('Test 1 Score')\n",
    "    ax.set_ylabel('Test 2 Score')\n",
    "    \n",
    "plot_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意到其中的正负两类数据并没有线性的决策界限。因此直接用logistic回归在这个数据集上并不能表现良好，因为它只能用来寻找一个线性的决策边界。\n",
    "\n",
    "所以接下会提到一个新的方法。\n",
    "\n",
    "## 2.2 Feature mapping\n",
    "一个拟合数据的更好的方法是从每个数据点创建更多的特征。\n",
    "\n",
    "我们将把这些特征映射到所有的x1和x2的多项式项上，直到第六次幂。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "def feature_mapping(x1, x2, power):\n",
    "    data = {}\n",
    "    for i in np.arange(power + 1):\n",
    "        for p in np.arange(i + 1):\n",
    "            data[\"f{}{}\".format(i - p, p)] = np.power(x1, i - p) * np.power(x2, p)\n",
    "\n",
    "    return pd.DataFrame(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "x1 = data2['Test 1'].values\n",
    "x2 = data2['Test 2'].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "features = feature_mapping(x1, x2, 6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f00</th>\n",
       "      <th>f10</th>\n",
       "      <th>f01</th>\n",
       "      <th>f20</th>\n",
       "      <th>f11</th>\n",
       "      <th>f02</th>\n",
       "      <th>f30</th>\n",
       "      <th>f21</th>\n",
       "      <th>f12</th>\n",
       "      <th>f03</th>\n",
       "      <th>...</th>\n",
       "      <th>f23</th>\n",
       "      <th>f14</th>\n",
       "      <th>f05</th>\n",
       "      <th>f60</th>\n",
       "      <th>f51</th>\n",
       "      <th>f42</th>\n",
       "      <th>f33</th>\n",
       "      <th>f24</th>\n",
       "      <th>f15</th>\n",
       "      <th>f06</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.051267</td>\n",
       "      <td>0.69956</td>\n",
       "      <td>0.002628</td>\n",
       "      <td>0.035864</td>\n",
       "      <td>0.489384</td>\n",
       "      <td>0.000135</td>\n",
       "      <td>0.001839</td>\n",
       "      <td>0.025089</td>\n",
       "      <td>0.342354</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000900</td>\n",
       "      <td>0.012278</td>\n",
       "      <td>0.167542</td>\n",
       "      <td>1.815630e-08</td>\n",
       "      <td>2.477505e-07</td>\n",
       "      <td>0.000003</td>\n",
       "      <td>0.000046</td>\n",
       "      <td>0.000629</td>\n",
       "      <td>0.008589</td>\n",
       "      <td>0.117206</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.092742</td>\n",
       "      <td>0.68494</td>\n",
       "      <td>0.008601</td>\n",
       "      <td>-0.063523</td>\n",
       "      <td>0.469143</td>\n",
       "      <td>-0.000798</td>\n",
       "      <td>0.005891</td>\n",
       "      <td>-0.043509</td>\n",
       "      <td>0.321335</td>\n",
       "      <td>...</td>\n",
       "      <td>0.002764</td>\n",
       "      <td>-0.020412</td>\n",
       "      <td>0.150752</td>\n",
       "      <td>6.362953e-07</td>\n",
       "      <td>-4.699318e-06</td>\n",
       "      <td>0.000035</td>\n",
       "      <td>-0.000256</td>\n",
       "      <td>0.001893</td>\n",
       "      <td>-0.013981</td>\n",
       "      <td>0.103256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.213710</td>\n",
       "      <td>0.69225</td>\n",
       "      <td>0.045672</td>\n",
       "      <td>-0.147941</td>\n",
       "      <td>0.479210</td>\n",
       "      <td>-0.009761</td>\n",
       "      <td>0.031616</td>\n",
       "      <td>-0.102412</td>\n",
       "      <td>0.331733</td>\n",
       "      <td>...</td>\n",
       "      <td>0.015151</td>\n",
       "      <td>-0.049077</td>\n",
       "      <td>0.158970</td>\n",
       "      <td>9.526844e-05</td>\n",
       "      <td>-3.085938e-04</td>\n",
       "      <td>0.001000</td>\n",
       "      <td>-0.003238</td>\n",
       "      <td>0.010488</td>\n",
       "      <td>-0.033973</td>\n",
       "      <td>0.110047</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.375000</td>\n",
       "      <td>0.50219</td>\n",
       "      <td>0.140625</td>\n",
       "      <td>-0.188321</td>\n",
       "      <td>0.252195</td>\n",
       "      <td>-0.052734</td>\n",
       "      <td>0.070620</td>\n",
       "      <td>-0.094573</td>\n",
       "      <td>0.126650</td>\n",
       "      <td>...</td>\n",
       "      <td>0.017810</td>\n",
       "      <td>-0.023851</td>\n",
       "      <td>0.031940</td>\n",
       "      <td>2.780914e-03</td>\n",
       "      <td>-3.724126e-03</td>\n",
       "      <td>0.004987</td>\n",
       "      <td>-0.006679</td>\n",
       "      <td>0.008944</td>\n",
       "      <td>-0.011978</td>\n",
       "      <td>0.016040</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.513250</td>\n",
       "      <td>0.46564</td>\n",
       "      <td>0.263426</td>\n",
       "      <td>-0.238990</td>\n",
       "      <td>0.216821</td>\n",
       "      <td>-0.135203</td>\n",
       "      <td>0.122661</td>\n",
       "      <td>-0.111283</td>\n",
       "      <td>0.100960</td>\n",
       "      <td>...</td>\n",
       "      <td>0.026596</td>\n",
       "      <td>-0.024128</td>\n",
       "      <td>0.021890</td>\n",
       "      <td>1.827990e-02</td>\n",
       "      <td>-1.658422e-02</td>\n",
       "      <td>0.015046</td>\n",
       "      <td>-0.013650</td>\n",
       "      <td>0.012384</td>\n",
       "      <td>-0.011235</td>\n",
       "      <td>0.010193</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 28 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   f00       f10      f01       f20       f11       f02       f30       f21  \\\n",
       "0  1.0  0.051267  0.69956  0.002628  0.035864  0.489384  0.000135  0.001839   \n",
       "1  1.0 -0.092742  0.68494  0.008601 -0.063523  0.469143 -0.000798  0.005891   \n",
       "2  1.0 -0.213710  0.69225  0.045672 -0.147941  0.479210 -0.009761  0.031616   \n",
       "3  1.0 -0.375000  0.50219  0.140625 -0.188321  0.252195 -0.052734  0.070620   \n",
       "4  1.0 -0.513250  0.46564  0.263426 -0.238990  0.216821 -0.135203  0.122661   \n",
       "\n",
       "        f12       f03    ...          f23       f14       f05           f60  \\\n",
       "0  0.025089  0.342354    ...     0.000900  0.012278  0.167542  1.815630e-08   \n",
       "1 -0.043509  0.321335    ...     0.002764 -0.020412  0.150752  6.362953e-07   \n",
       "2 -0.102412  0.331733    ...     0.015151 -0.049077  0.158970  9.526844e-05   \n",
       "3 -0.094573  0.126650    ...     0.017810 -0.023851  0.031940  2.780914e-03   \n",
       "4 -0.111283  0.100960    ...     0.026596 -0.024128  0.021890  1.827990e-02   \n",
       "\n",
       "            f51       f42       f33       f24       f15       f06  \n",
       "0  2.477505e-07  0.000003  0.000046  0.000629  0.008589  0.117206  \n",
       "1 -4.699318e-06  0.000035 -0.000256  0.001893 -0.013981  0.103256  \n",
       "2 -3.085938e-04  0.001000 -0.003238  0.010488 -0.033973  0.110047  \n",
       "3 -3.724126e-03  0.004987 -0.006679  0.008944 -0.011978  0.016040  \n",
       "4 -1.658422e-02  0.015046 -0.013650  0.012384 -0.011235  0.010193  \n",
       "\n",
       "[5 rows x 28 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.3 正则化代价函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((118, 28), (118,), (28,))"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = features\n",
    "y = data2['Accepted'].values\n",
    "\n",
    "theta = np.zeros(X.shape[1])\n",
    "X.shape, y.shape, theta.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cost_reg(theta, X, y, l=1):\n",
    "    # 不惩罚第一项\n",
    "    _theta = theta[1: ]\n",
    "    reg = (l / (2 * len(X))) *(_theta @ _theta)  # _theta@_theta == inner product\n",
    "    \n",
    "    return cost(theta, X, y) + reg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6931471805599461"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cost_reg(theta, X, y, l=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.4 正则化梯度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_reg(theta, X, y, l=1):\n",
    "    reg = (1 / len(X)) * theta\n",
    "    reg[0] = 0  \n",
    "    return gradient(theta, X, y) + reg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "f00    0.008475\n",
       "f10    0.018788\n",
       "f01    0.000078\n",
       "f20    0.050345\n",
       "f11    0.011501\n",
       "f02    0.037665\n",
       "f30    0.018356\n",
       "f21    0.007324\n",
       "f12    0.008192\n",
       "f03    0.023476\n",
       "f40    0.039349\n",
       "f31    0.002239\n",
       "f22    0.012860\n",
       "f13    0.003096\n",
       "f04    0.039303\n",
       "f50    0.019971\n",
       "f41    0.004330\n",
       "f32    0.003386\n",
       "f23    0.005838\n",
       "f14    0.004476\n",
       "f05    0.031008\n",
       "f60    0.031031\n",
       "f51    0.001097\n",
       "f42    0.006316\n",
       "f33    0.000409\n",
       "f24    0.007265\n",
       "f15    0.001376\n",
       "f06    0.038794\n",
       "dtype: float64"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gradient_reg(theta, X, y, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.5 学习参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 1.02252845,  0.56283947,  1.13465378, -1.78530023, -0.66539149,\n",
       "        -1.01863396,  0.13957   , -0.29358944, -0.30102267, -0.08324513,\n",
       "        -1.27206004, -0.06137383, -0.53996526, -0.17881809, -0.9419886 ,\n",
       "        -0.14054855, -0.17736663, -0.0769737 , -0.22918951, -0.21349652,\n",
       "        -0.37205413, -0.86417673,  0.00890083, -0.26795962, -0.00362248,\n",
       "        -0.28315235, -0.07321588, -0.75992674]), 57, 4)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result2 = opt.fmin_tnc(func=cost_reg, x0=theta, fprime=gradient_reg, args=(X, y, 2))\n",
    "result2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们还可以使用高级Python库scikit-learn来解决这个问题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='liblinear',\n",
       "          tol=0.0001, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn import linear_model#调用sklearn的线性回归包\n",
    "model = linear_model.LogisticRegression(penalty='l2', C=1.0, solver='liblinear')\n",
    "model.fit(X, y.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8305084745762712"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.score(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.6 评估逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8050847457627118"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "final_theta = result2[0]\n",
    "predictions = predict(final_theta, X)\n",
    "correct = [1 if a==b else 0 for (a, b) in zip(predictions, y)]\n",
    "accuracy = sum(correct) / len(correct)\n",
    "accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "或者用skearn中的方法来评估结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.85      0.75      0.80        60\n",
      "           1       0.77      0.86      0.81        58\n",
      "\n",
      "   micro avg       0.81      0.81      0.81       118\n",
      "   macro avg       0.81      0.81      0.80       118\n",
      "weighted avg       0.81      0.81      0.80       118\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "\n",
    "print(classification_report(y, predictions))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.7 决策边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.linspace(-1, 1.5, 250)\n",
    "xx, yy = np.meshgrid(x, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.8, 1.2)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "z = feature_mapping(xx.ravel(), yy.ravel(), 6).values\n",
    "z = z @ final_theta\n",
    "z = z.reshape(xx.shape)\n",
    "\n",
    "plot_data()\n",
    "plt.contour(xx, yy, z, 0)\n",
    "plt.ylim(-.8, 1.2)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
